package Day_0218.ValuePass;

/**
 * @author zxc
 * @date 2023/02/18 19:37
 **/
public class ValuePass {
    public static void main(String[] args) {
        /**
         * 谈一谈对于Java中方法调用只支持值传递的理解
         * ===》
         * 一，
         * 1.当一个对象被当作参数传递到一个方法后，此方法可改变这个对象的属性，并可返回变化后的结果，那么这里就是引用传递;
         *
         * 2.Java 语言的方法调用，只支持参数的值传递。
         * （1）若是某个基本类型值 作为参数被传递到方法中，则在调用过程中，改变参数的值，有且仅在调用方法的过程中有效;
         * （2）当一个对象实例作为一个参数被传递到方法中时，参数的值，就是对该对象的引用。
         *  对象的属性可以在被调用过程中被改变，但对对象引用的改变是不会影响到调用者的;
         *
         * 二，为什么 Java 中只有值传递
         * 1.按值调用(call by value)表示方法接收的是调用者提供的值，
         * 而按引用调用（call by reference)表示方法接收的是调用者提供的变量地址。
         * ===》
         * （1）一个方法可以修改 传递引用中所对应的变量值，但是不能修改传递引用的变量地址;
         * （2）方法不能修改 传递值所对应的变量值;
         * （3）Java程序设计语言总是采用按值调用。
         *  也就是说，方法得到的是所有参数值的一个拷贝，也就是说，方法不能修改传递给它的任何参数变量的内容。
         *
         * 2.方法中参数为基本数据类型的值;
         * public static void main(String[] args) {
         *  int num1 = 10;
         *  int num2 = 20;
         *  swap(num1, num2);
         *  System.out.println("num1 = " + num1);
         *  System.out.println("num2 = " + num2);
         * }
         * public static void swap(int a, int b) {
         *  int temp = a;
         *  a = b;
         *  b = temp;
         *  System.out.println("a = " + a);
         *  System.out.println("b = " + b);
         * }
         * ===》
         * （1）在swap方法中，a、b的值进行交换，并不会影响到 num1、num2。
         * （2）因为，a、b中的值，只是从num1、num2 的复制过来的。
         *  也就是说，a、b相当于num1、num2 的副本，副本的内容无论怎么修改，都不会影响到原件本身。
         * （3）总结 ：一个方法不能修改一个基本数据类型的参数，
         * （4）即，在值传递的前提下，在方法所传递的参数是真实数据的拷贝文件，
         *  可以理解为，在对于该参数无论进行何种修改，真实数据都不会受到影响;
         *
         * 3.方法中参数为 对象引用
         * public static void main(String[] args) {
         *  int[] arr = { 1, 2, 3, 4, 5 };
         *  System.out.println(arr[0]);
         *  change(arr);
         *  System.out.println(arr[0]);
         * }
         * public static void change(int[] array) {
         *  // 将数组的第一个元素变为0
         *  array[0] = 0;
         * }
         * ===》
         * （1）array 被初始化 arr 的拷贝，也就是一个对象的引用，也就是说 array 和 arr 指向的是同一个数组对象。
         *  因此，外部对引用对象的改变会反映到所对应的对象上。
         * （2）实现一个改变对象参数状态的方法并不是一件难事。
         *  理由很简单，方法得到的是对象引用的拷贝，对象引用及其他的拷贝同时引用同一个对象。
         * （3）由于传递参数为对象引用（指向某个对象的内存地址），
         *  即，原本数据和拷贝文件都指向同一个对象，那么对于该对象属性的修改是有效的;
         *  同时，由于值传递，所以对于所传入的对象地址进行修改，对于真实对象的地址是无效的;
         *
         *  4.验证Java是值传递
         * public class Test {
         * public static void main(String[] args) {
         *  Student s1 = new Student("小张");
         *  Student s2 = new Student("小李");
         *  Test.swap(s1, s2);
         *  System.out.println("s1:" + s1.getName());
         *  System.out.println("s2:" + s2.getName());
         * }
         * public static void swap(Student x, Student y) {
         *  Student temp = x;
         *  x = y;
         *  y = temp;
         *  System.out.println("x:" + x.getName());
         *  System.out.println("y:" + y.getName());
         * }
         * }
         * ===》
         * （1）由于Java中，所有对象所存储的，都是对象引用,而并不是真正的对象，真正的对象是存储在Java堆空间中的;
         * （即，保存的是所需要对象的内存地址;）
         * （2）变量x 所保存的是 变量s1所指向对象引用的拷贝（s1所指向的对象是"小张"）;
         *  变量y 所保存的是 变量s2所指向对象引用的拷贝;（s2所指向的对象是"小李"）
         *  若是使得x 所指向的对象引用 变为 对象"小李"的对象引用 && 使得y 所指向的对象引用 变为 对象"小张"的对象引用;
         *  ===》
         *  swap方法，并没有改变存储在变量 s1 和 s2 中的对象引用。
         *  swap方法的参数x和y被初始化为两个对象引用的拷贝，这个方法交换的是这两个拷贝;
         *
         *  ==================
         *  总结 ：
         *  （1）方法中所传递的参数为 对象变量（该变量中所存储的对象引用）
         *   由于在Java中，所有实例对象变量所保存的，都是对象引用，而并不是对象本身;
         *
         *
         *  5.总结
         * 下面再总结一下Java中方法参数的使用情况 ：
         * （1）一个方法不能修改一个基本数据类型的参数;（即，数值型/布尔型》
         * （2）一个方法可以改变一个对象参数的状态。
         * （3）一个方法不能让对象参数,指向新的对象引用。
         *
         */
    }
}
